﻿using System.Text;
using ku.umbruch.contract;
using System;

namespace ku.umbruch {
    public class Umbruch : IUmbruch{

        public string Trenne(string zuTrennenderText, int zeilenLänge) {
            var umgebrochenerText = new StringBuilder();
            var zeilen = TrenneInZeilen(zuTrennenderText);
            foreach (string zeile in zeilen) {
                umgebrochenerText.Append(ErzeugeZeileMitUmgebrochenenText(zeile, zeilenLänge) + "\r\n");
            }
            umgebrochenerText.Remove(umgebrochenerText.Length - 2, 2);
            return umgebrochenerText.ToString();
        }

        internal string[] TrenneInZeilen(string zuTrennenderText) {
            return zuTrennenderText.Replace("\r\n", "\n").Split(new[] { "\n" }, StringSplitOptions.None);
        }

        internal string ErzeugeZeileMitUmgebrochenenText(string zeile, int zeilenLänge) {

            var umgebrocheneZeile = new StringBuilder();

            while (zeile.Length > 0) {
                if (zeile.Length <= zeilenLänge) {
                    umgebrocheneZeile.Append(zeile);
                    break;
                }

                var offset = 1;
                int trennPos = zeile.Substring(zeilenLänge, 1) == " " 
                    ? zeilenLänge 
                    : zeile.Substring(0, zeilenLänge).LastIndexOf(" ");

                if (-1 == trennPos) {
                    trennPos = zeilenLänge;
                    offset = 0;
                }

                var toAppend = (zeile.Substring(0, trennPos) == "") ? "" : "\r\n";

                umgebrocheneZeile.Append(zeile.Substring(0, trennPos) + toAppend);
                zeile = zeile.Substring(trennPos + offset);
            }

            return umgebrocheneZeile.ToString();
        }
    }
}
